﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
//using Excel = Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
using System.Data;
using System.Collections.Specialized;
using Web.Framework.Helpers;
using CrmContacto.WebApp.Code.InnerClasses.FrontEnd;
using CrmContacto.Contracts;
using CrmContacto.Contracts.Contracts.Misc;
using CrmContacto.Contracts.Enums;
using System.Text;
using System.Text.RegularExpressions;
using Web.Framework.Validation;
using Web.Framework.Translate;
using CrmContacto.Contracts.Contracts;

namespace Web.CrmContacto.Code
{
    public class ExcelHelper
    {
        public static List<ClienteWrap> ObtenerContactos(string filePath, ExcelHelperContactosParam excelContactosParam)
        {
            List<ClienteWrap> contactos = new List<ClienteWrap>();
            DataTable dataTable = ExcelHelperBase.GetDataTableFromExcel(filePath);

            RegexUtility regexUtil = new RegexUtility();

            // Columnas
            int j = 0;
            int nombreIndex = j++;
            int apellidoIndex = j++;
            int emailIndex = j++;
            int tipoDocumentoIndex = j++;
            int nroDocumentoIndex = j++;
            int diaNacIndex = j++;
            int mesNacIndex = j++;
            int anioNacIndex = j++;
            int nacionalidadIndex = j++;
            int provinciaIndex = j++;
            int domicilioIndex = j++;
            int codigoPostalIndex = j++;
            int categoriasIndex = j++;
            int sexoIndex = j++;
            int telefonoIndex = j++;
            int nroCredencial = j++;
            int deseaRecibirEmailsIndex = j++;

            for (int i = 0; i < dataTable.Rows.Count; i++)
            {               
                if (dataTable.Rows[i][nombreIndex] != DBNull.Value)
                {
                    StringBuilder errorMessages = new StringBuilder();
                    ClienteWrap clienteWrap = new ClienteWrap();
                    clienteWrap.OrigenId = (int)TipoContactoOrigen.Excel;
                    clienteWrap.EmpresaId = excelContactosParam.EmpresaId;

                    string nombre = dataTable.Rows[i][nombreIndex].ToString();
                    if (!String.IsNullOrEmpty(nombre))
                    {
                        clienteWrap.Nombre = nombre;
                    }

                    string apellido = dataTable.Rows[i][apellidoIndex].ToString();
                    if (!String.IsNullOrEmpty(apellido))
                    {
                        clienteWrap.Apellido = apellido;
                    }

                    string email = dataTable.Rows[i][emailIndex].ToString();
                    if (!String.IsNullOrEmpty(email))
                    {
                        if (regexUtil.IsValidEmail(email))
                        {
                            clienteWrap.Email = email;
                        }
                        else
                        {
                            errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.EmailInvalido"], email);
                        }
                    }

                    string tipoDoc = dataTable.Rows[i][tipoDocumentoIndex].ToString();
                    if (!String.IsNullOrEmpty(tipoDoc))
                    {
                        // Busco entre los valores posibles
                        var tipoDocMB = excelContactosParam.TiposDeDocumento.Where(t => t.Nombre == tipoDoc).SingleOrDefault();
                        if (tipoDocMB != null)
                        {
                            clienteWrap.TipoDocumentoId = tipoDocMB.Id;
                        }
                        else
                        {
                            errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.TipoDocNoEnLista"], tipoDoc);
                        }
                    }

                    string nroDocumentoStr = dataTable.Rows[i][nroDocumentoIndex].ToString();
                    decimal nroDocumento = 0;
                    if (!String.IsNullOrEmpty(nroDocumentoStr))
                    {
                        if (Decimal.TryParse(nroDocumentoStr, out nroDocumento))
                        {
                            clienteWrap.Dni = nroDocumento;
                        }
                        else
                        {
                            errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.NroDocumentoInvalido"], nroDocumentoStr);
                        }
                    }

                    string diaNacStr = dataTable.Rows[i][diaNacIndex].ToString();
                    short diaNac;
                    if (!String.IsNullOrEmpty(diaNacStr))
                    {
                        if (Int16.TryParse(diaNacStr, out diaNac))
                        {
                            clienteWrap.CumpleDia = diaNac;
                        }
                        else
                        {
                            errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.DiaNacimientoInvalido"], diaNacStr);
                        }
                    }

                    string mesNacStr = dataTable.Rows[i][mesNacIndex].ToString();
                    short mesNac;
                    if (!String.IsNullOrEmpty(mesNacStr))
                    {
                        if (Int16.TryParse(mesNacStr, out mesNac))
                        {
                            clienteWrap.CumpleMes = mesNac;
                        }
                        else
                        {
                            errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.MesNacimientoInvalido"], mesNacStr);
                        }
                    }

                    string anioNacStr = dataTable.Rows[i][anioNacIndex].ToString();
                    short anioNac;
                    if (!String.IsNullOrEmpty(anioNacStr))
                    {
                        if (Int16.TryParse(anioNacStr, out anioNac))
                        {
                            clienteWrap.CumpleAnio = anioNac;
                        }
                        else
                        {
                            errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.AnioNacimientoInvalido"], anioNacStr);
                        }
                    }

                    string nacionalidadStr = dataTable.Rows[i][nacionalidadIndex].ToString();
                    if (!String.IsNullOrEmpty(nacionalidadStr))
                    {
                        // Busco entre los valores posibles
                        var nacionalidadMB = excelContactosParam.Paises.Where(t => t.Nombre == nacionalidadStr).SingleOrDefault();
                        if (nacionalidadMB != null)
                        {
                            clienteWrap.NacionalidadId = nacionalidadMB.Id;
                        }
                        else
                        {
                            errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.NacionalidadNoEnLista"], nacionalidadStr);
                        }
                    }

                    string provinciaStr = dataTable.Rows[i][provinciaIndex].ToString();
                    if (!String.IsNullOrEmpty(provinciaStr))
                    {
                        // Busco entre los valores posibles
                        var provinciadMB = excelContactosParam.Provincias.Where(t => t.Nombre == provinciaStr).SingleOrDefault();
                        if (provinciadMB != null)
                        {
                            clienteWrap.ProvinciaId = provinciadMB.Id;
                        }
                        else
                        {
                            errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.ProvinciaNoEnLista"], provinciaStr);
                        }
                    }

                    string domicilio = dataTable.Rows[i][domicilioIndex].ToString();
                    if (!String.IsNullOrEmpty(domicilio))
                    {
                        clienteWrap.Domicilio = domicilio;
                    }

                    string codigoPostal = dataTable.Rows[i][codigoPostalIndex].ToString();
                    if (!String.IsNullOrEmpty(codigoPostal))
                    {
                        clienteWrap.CodigoPostal = codigoPostal;
                    }

                    string categoriasCsv = dataTable.Rows[i][categoriasIndex].ToString();
                    if (!String.IsNullOrEmpty(categoriasCsv))
                    {
                        string[] categoriaSplit = categoriasCsv.Split(',');

                        foreach (string cat in categoriaSplit)
                        {
                            if (!String.IsNullOrEmpty(cat))
                            {
                                string categ = cat.Trim();
                                // Busco entre los valores posibles
                                var categoriadMB = excelContactosParam.Categorias.Where(t => t.Nombre == categ).SingleOrDefault();
                                if (categoriadMB != null)
                                {
                                    clienteWrap.Categorias.Add(categoriadMB);
                                }
                                else
                                {
                                    errorMessages.AppendFormat(LocalizationProvider.Instance["Bo.Excel.Contacto.CategoriaNoEnLista"], categ);
                                }
                            }
                        }                        
                    }

                    string sexoStr = dataTable.Rows[i][sexoIndex].ToString();
                    if (!String.IsNullOrEmpty(sexoStr))
                    {
                        if (sexoStr == "M")
                        {
                            clienteWrap.Sexo = (int)SexoEnum.Masculino;
                        }
                        else if (sexoStr == "F")
                        {
                            clienteWrap.Sexo = (int)SexoEnum.Femenino;
                        }
                    }

                    string telefono = dataTable.Rows[i][telefonoIndex].ToString();
                    if (!String.IsNullOrEmpty(telefono))
                    {
                        clienteWrap.Telefono = telefono;
                    }

                    string credencial = dataTable.Rows[i][nroCredencial].ToString();
                    if (!String.IsNullOrEmpty(credencial))
                    {
                        clienteWrap.NroCredencial = credencial;
                    }

                    string recibirEmails = dataTable.Rows[i][deseaRecibirEmailsIndex].ToString();
                    if (!String.IsNullOrEmpty(recibirEmails))
                    {
                        clienteWrap.DeseaRecibirEmails = recibirEmails == "SI";                        
                    }

                    clienteWrap.Mensaje = errorMessages.ToString();                    
                    contactos.Add(clienteWrap);
                }
            }

            return contactos;            
        }

        internal static List<AccionDeMarketingEmailResultado> ObtenerResultadosEmail(string filePath, int accionDeMarketingComunicacionId)
        {
            List<AccionDeMarketingEmailResultado> resultados = new List<AccionDeMarketingEmailResultado>();
            DataTable dataTable = ExcelHelperBase.GetDataTableFromExcel(filePath);

            RegexUtility regexUtil = new RegexUtility();

            // Columnas
            int j = 0;
            int emailIndex = j++;            
            int tipoReboteIndex = j++;
            int llegoADestinoIndex = j++;
            int abrioEmailIndex = j++;
            int accionEjecutadaIndex = j++;
            int fechaAperturaIndex = j++;

            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                if (dataTable.Rows[i][emailIndex] != DBNull.Value)
                {
                    StringBuilder errorMessages = new StringBuilder();
                    AccionDeMarketingEmailResultado resultadoEmail = new AccionDeMarketingEmailResultado();
                    resultados.Add(resultadoEmail);

                    string email = dataTable.Rows[i][emailIndex].ToString();
                    if (!String.IsNullOrEmpty(email))
                    {
                        resultadoEmail.Email = email;
                    }

                    string tipoRebote = dataTable.Rows[i][tipoReboteIndex].ToString();
                    if (!String.IsNullOrEmpty(tipoRebote))
                    {
                        resultadoEmail.EmailTipoRebote = tipoRebote == "Hard";
                    }

                    string abrioEmail = dataTable.Rows[i][abrioEmailIndex].ToString();
                    if (!String.IsNullOrEmpty(abrioEmail))
                    {
                        resultadoEmail.EmailAbierto = abrioEmail == "SI";
                    }

                    string accionEjecutada = dataTable.Rows[i][accionEjecutadaIndex].ToString();
                    if (!String.IsNullOrEmpty(accionEjecutada))
                    {
                        resultadoEmail.AccionEjecutada = accionEjecutada == "SI";
                    }

                    string fechaApertura = dataTable.Rows[i][fechaAperturaIndex].ToString();
                    if (!String.IsNullOrEmpty(fechaApertura))
                    {
                        try
                        {
                            DateTime fechaAperturaDate = (DateTime)dataTable.Rows[i][fechaAperturaIndex];
                            resultadoEmail.EmailFechaApertura = fechaAperturaDate;
                        }
                        catch (Exception ex)
                        {
                            errorMessages.Append(ex.Message);
                        }
                    }

                    if (errorMessages.Length > 0)
                    {
                        resultadoEmail.Mensaje = errorMessages.ToString();
                    }
                }
            }

            return resultados;
        }
    }
}